package com.jwiki.app.jtoolkit.common.db;

import java.math.BigDecimal;
import java.sql.Timestamp;
import java.sql.Types;
import java.util.Date;

public enum JdbcType {
    
    ARRAY(Types.ARRAY, Object.class.getName()),
    
    BIT(Types.BIT, Boolean.class.getName()),
    
    TINYINT(Types.TINYINT, Boolean.class.getName()),
    
    SMALLINT(Types.SMALLINT, Integer.class.getName()),
    
    INTEGER(Types.INTEGER, Integer.class.getName()),
    
    BIGINT(Types.BIGINT, Long.class.getName()),
    
    FLOAT(Types.FLOAT, Float.class.getName()),
    
    REAL(Types.REAL, Float.class.getName()),
    
    DOUBLE(Types.DOUBLE, Double.class.getName()),
    
    NUMERIC(Types.NUMERIC, BigDecimal.class.getName()),
    
    DECIMAL(Types.DECIMAL, BigDecimal.class.getName()),
    
    CHAR(Types.CHAR, String.class.getName()),
    
    VARCHAR(Types.VARCHAR, String.class.getName()),
    
    LONGVARCHAR(Types.LONGVARCHAR, String.class.getName()),
    
    DATE(Types.DATE, Date.class.getName()),
    
    TIME(Types.TIME, Date.class.getName()),
    
    TIMESTAMP(Types.TIMESTAMP, Timestamp.class.getName()),
    
    BINARY(Types.BINARY, "byte[]"),
    
    VARBINARY(Types.VARBINARY, "byte[]"),
    
    LONGVARBINARY(Types.LONGVARBINARY, "byte[]"),
    
    NULL(Types.NULL, Object.class.getName()),
    
    OTHER(Types.OTHER, Object.class.getName()),
    
    BLOB(Types.BLOB, "byte[]"),
    
    CLOB(Types.CLOB, String.class.getName()),
    
    BOOLEAN(Types.BOOLEAN, Boolean.class.getName()),
    
    CURSOR(-10, Object.class.getName()), // Oracle
    
    UNDEFINED(Integer.MIN_VALUE + 1000, Object.class.getName()),
    
    NVARCHAR(Types.NVARCHAR, String.class.getName()), // JDK6
    
    NCHAR(Types.NCHAR, String.class.getName()), // JDK6
    
    NCLOB(Types.NCLOB, String.class.getName()), // JDK6
    
    STRUCT(Types.STRUCT, Object.class.getName()),
    
    JAVA_OBJECT(Types.JAVA_OBJECT, Object.class.getName()),
    
    DISTINCT(Types.DISTINCT, Object.class.getName()),
    
    REF(Types.REF, Object.class.getName()),
    
    DATALINK(Types.DATALINK, Object.class.getName()),
    
    ROWID(Types.ROWID, Object.class.getName()), // JDK6
    
    LONGNVARCHAR(Types.LONGNVARCHAR, String.class.getName()), // JDK6
    
    SQLXML(Types.SQLXML, Object.class.getName()), // JDK6
    
    DATETIMEOFFSET(-155, Object.class.getName()); // SQL Server 2008
    
    private int jdbcType;
    private String javaType;

    JdbcType(int jdbcType, String javaType) {
        this.jdbcType = jdbcType;
        this.javaType = javaType;
    }

    public int getJdbcType() {
        return jdbcType;
    }

    public String getJavaType() {
        return javaType;
    }
    
    public static int forJdbcType(String javaType) {
        for (JdbcType jdbcType : JdbcType.values()) {
            if (jdbcType.getJavaType().equals(javaType)) {
                return jdbcType.getJdbcType();
            }
        }
        return JAVA_OBJECT.getJdbcType();
    }

}
